﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Acceso_a_Datos.IDAOS;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;

namespace Sistema_Totem.Acceso_a_Datos.DAOS
{
    public class DAOCliente : DAOSQLServer, iDAOCliente
    {
    
        #region Atributos - Grupo Login y Proyecto

        private Conexion _conexion = new Conexion();
        private SqlCommand _comando = new SqlCommand();
        private SqlDataReader _lectorConsulta = null;
        private List<Entidad> _clientes = null;
        private Entidad _miCliente = null;

        #endregion Atributos - Grupo Login y Proyecto

        #region Agregar Cliente
        /// <summary>
        /// Regista el Cliente nuevo en la Base de datos 
        /// </summary>
        /// <param name="cliente">Recibe un objeto del tipo cliente</param>
        /// <returns>Mensaje de confirmacion sobre la transaccion</returns>
        public bool AgregarCliente(Cliente cliente)
        {
            //se instancia una conexion a la BD
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[insertarCliente]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@DirCli", cliente.Direccion);
                command.Parameters.AddWithValue("@NombreCli", cliente.Nombre);
                command.Parameters.AddWithValue("@TelefonoCli", cliente.Telefono);
                command.Parameters.AddWithValue("@CorreoCli", cliente.Correo);
                command.Parameters.AddWithValue("@RifCli", cliente.Rif);
                //command.Parameters.AddWithValue("@LogoCli", cliente.Logo);
                command.Parameters.AddWithValue("@EstatusCli", cliente.Status);
                SqlDataReader readers = command.ExecuteReader();
                readers.Close();
                //mensaje de confirmacion exitoso
                return true;
            }
            catch (SqlException)
            {
                return false;   
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                //se cierra la conexion a la BD
                bd.CerrarConexionBd();
            }
        }

        #endregion Agregar Cliente

        public List<Cliente> ConsultarCliente()
        {
            return null;
        }

        #region Grupo Login y Proyecto

        #region Consultar Cliente 
       
        public Entidad ConsultarCliente(int _idProyecto)
        {            
            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ConsularClienteProyecto]";
                _comando.Parameters.AddWithValue("@idProyecto",_idProyecto);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();

                while (_lectorConsulta.Read())
                {

                    _miCliente = FabricaEntidad.CrearCliente();

                    (_miCliente as Cliente).Id = Convert.ToInt32(_lectorConsulta.GetDecimal(0));
                    (_miCliente as Cliente).Nombre = _lectorConsulta.GetString(1);
                    (_miCliente as Cliente).Telefono = _lectorConsulta.GetString(2);
                    (_miCliente as Cliente).Correo = _lectorConsulta.GetString(3);
                    (_miCliente as Cliente).Rif = _lectorConsulta.GetString(4);
                    (_miCliente as Cliente).Direccion = _lectorConsulta.GetString(6);
                    (_miCliente as Cliente).Status = _lectorConsulta.GetString(7);
                }

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }

            return _miCliente;
        }

        #endregion EndConsultarProyecto

        #region ConsultarTodosLosClientes

        public List<Entidad> ConsultarTodosLosClientes()
        {
            _clientes = new List<Entidad>();

            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ConsultarTodosLosClientes]";                
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();

                while (_lectorConsulta.Read())
                {
                    _miCliente = FabricaEntidad.CrearCliente();

                    (_miCliente as Cliente).Nombre = _lectorConsulta.GetString(1);
                    (_miCliente as Cliente).Telefono = _lectorConsulta.GetString(2);
                    (_miCliente as Cliente).Correo = _lectorConsulta.GetString(3);
                    (_miCliente as Cliente).Rif = _lectorConsulta.GetString(4);                    
                    (_miCliente as Cliente).Direccion = _lectorConsulta.GetString(6);
                    (_miCliente as Cliente).Status = _lectorConsulta.GetString(7);

                    _clientes.Add(_miCliente);
                }

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }

            if (_clientes.Count == 0)
            {
                return null;
            }
            else

                return _clientes;
        }

        #endregion ConsultarTodosLosClientes

        #endregion



        public List<Entidad> ConsultarClientesNoProyecto(int _idProyecto)
        {
           
            _clientes = new List<Entidad>();

            try
            {
                _conexion.AbrirConexionBd();

                _comando.Connection = _conexion.ObjetoConexion();

                _comando.CommandType = CommandType.StoredProcedure;

                _comando.CommandText = "[dbo].[ConsularClientesNoProyecto]";
                _comando.Parameters.AddWithValue("@idProyecto", _idProyecto);
                _comando.CommandTimeout = 10;

                _lectorConsulta = _comando.ExecuteReader();

                while (_lectorConsulta.Read())
                {
                    _miCliente = FabricaEntidad.CrearCliente();

                    (_miCliente as Cliente).Nombre = _lectorConsulta.GetString(1);
                    (_miCliente as Cliente).Telefono = _lectorConsulta.GetString(2);
                    (_miCliente as Cliente).Correo = _lectorConsulta.GetString(3);
                    (_miCliente as Cliente).Rif = _lectorConsulta.GetString(4);                    
                    (_miCliente as Cliente).Direccion = _lectorConsulta.GetString(6);
                    (_miCliente as Cliente).Status = _lectorConsulta.GetString(7);

                    _clientes.Add(_miCliente);
                }

                _lectorConsulta.Close();

            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                _conexion.CerrarConexionBd();
            }

            if (_clientes.Count == 0)
            {
                return null;
            }
            else

                return _clientes;
        }
    }
}